package com.xhui.vimarket.common.utils.compare;

import java.lang.reflect.Method;
import java.util.Comparator;

/**
 * CommonComparator.
 * 
 */
public class CommonComparator implements Comparator {
    /**
     * @param 比较对象的属性用String[]的形式传过来.
     *            比较的对象一定要符合javaBean，即要有Set,Get方法
     */
    String[]   fields_user = null;
    static int type_user   = 1;   //1--数值型,切不排除重复，0--字符型
                                   
    public String[] getFields_user() {
        return fields_user;
    }
    
    public void setFields_user(String[] fields_user) {
        this.fields_user = fields_user;
    }
    
    public int getType() {
        return type_user;
    }
    
    public void setType(int type) {
        this.type_user = type;
    }
    
    /**
     * 定义排序规则 如果按照不止一个属性进行排序 这按照属性的顺序进行排序,类是sql order by 即只要比较出同位置的属性就停止.
     */
    public int compare(Object obj1, Object obj2) {
        // 没有属性，则不排序
        if (fields_user == null || fields_user.length <= 0) {
            return 2;// 不比较
        }
        for (int i = 0; i < fields_user.length; i++) {
            int rs = compareField(obj1, obj2, fields_user[i], type_user);
            if (rs == 1) {
                // 如果obj1的属性值大于obj2的属性值，则返回正数
                return 1;
            } else if (rs == -1) {
                // 小于返回负数
                return -1;
            }
        }
        // 相等返回0
        return 0;
    }
    
    /**
     * @param fieldName
     *            根据属性名排序
     * @return int   1 大于,0=,-1 小于
     */
    private static int compareField(Object o1, Object o2, String fieldName, int compareType) {
        try {
            if (1 == compareType) {
                long value1 = Long.parseLong(getFieldValueByName(fieldName, o1).toString());
                long value2 = Long.parseLong(getFieldValueByName(fieldName, o2).toString());
                if (value1 > value2) {
                    return 1;
                } else if (value1 == value2) {
                    return 0;
                }
                return -1;
            } else {
                String value1 = getFieldValueByName(fieldName, o1).toString();
                String value2 = getFieldValueByName(fieldName, o2).toString();
                
                if (value1.compareTo(value2) > 0) {
                    return 1;
                }
            }
        } catch (Exception e) {
            System.out.println("-----------------------------------------------------------------------------");
            System.out.println("---------对象的该属性不存在或者不允许在此安全级别上反射该属性，详情请查阅JAVA DOC--------");
            System.out.println("-----------------------------------------------------------------------------");
            e.printStackTrace();
        }
        
        return 0;
    }
    
    /**
     * @param fieldName
     *            属性名 obj 对象 反射获得该属性的值.
     */
    private static Object getFieldValueByName(String fieldName, Object obj) {
        try {
            String Letter = fieldName.substring(0, 1).toUpperCase();
            String methodStr = "get" + Letter + fieldName.substring(1);
            
            Method method = obj.getClass().getMethod(methodStr, new Class[] {});
            
            Object value = method.invoke(obj, new Object[] {});
            return value;
        } catch (Exception e) {
            System.out.println("------------------------------------------------------");
            System.out.println("---------该" + fieldName + "属性不存在----------------------");
            System.out.println("------------------------------------------------------");
            return null;
        }
    }
}
